package main

import "fmt"

//type Sayer interface {
//	say()
//}
//type Mover interface {
//	move()
//}
//type dog struct{}
//type cat struct{}
//
//func (d dog) say() {
//	fmt.Println("wangwangwang")
//}
//func (d dog) move() {
//	fmt.Println("runrunrun")
//}

//func (c cat) say() {
//	fmt.Println("miaomiaomiao")
//}
//func main() {
//	var s Sayer
//	var m Mover
//	a := dog{}
//	s = a
//	m = a
//	s.say()
//	m.move()
//}

//func (d *dog) say() {
//	fmt.Println("wangwangwang")
//}
//func (c *cat) say() {
//	fmt.Println("miaomiaomiao")
//}
//func main() {
//	var s Sayer
//	a := &cat{}
//	b := &dog{}
//	s = a
//	s.say()
//	s = b
//	s.say()
//}
//type WashingMachine interface {
//	wash()
//	dry()
//}
//type dryer struct{}
//
//func (d dryer) dry() {
//	fmt.Println("drydrydry")
//}
//
//type haier struct {
//	dryer
//}
//
//func (h haier) wash() {
//	fmt.Println("washwashwash")
//}
//func main() {
//	var w WashingMachine
//	h := haier{}
//	w = h
//	w.dry()
//	w.wash()
//}

type Sayer interface {
	say()
}
type Mover interface {
	move()
}
type animal interface {
	Sayer
	Mover
}
type cat struct {
	name string
}

func (c cat) say() {
	fmt.Println("喵喵喵")
}
func (c cat) move() {
	fmt.Println("runrunrun")
}
func main() {
	var a animal
	a = cat{name: "haha"}
	a.move()
	a.say()
	showType("hahaha")
	showType(a)
	b := []int{1, 2, 3, 4}
	showType(b)
	var emptyInterfaceMap = make(map[string]interface{})
	emptyInterfaceMap["name"] = "haha"
	emptyInterfaceMap["age"] = 18
	emptyInterfaceMap["married"] = false
	fmt.Println(emptyInterfaceMap)
	justifyType(b)
}
func showType(a interface{}) {
	fmt.Printf("%v is a %T\n", a, a)
}
func justifyType(x interface{}) {
	switch x.(type) {
	case string:
		fmt.Println("is string")
	case int:
		fmt.Println("is int")
	case bool:
		fmt.Println("is bool")
	case []int:
		fmt.Println("is []int")
	}
}
